iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
0

連接DB

DB相關的處理會用到gorm
直接來裝最新版

go get -u gorm.io/driver/mysql
go get -u gorm.io/gorm

gorm本身預設就會用到Connection Pool
所以要設最大最小的DB連線數
如果是單台server直接設到你DB的最大上限即可
model/init.go

// DBConn DBConn
var DBConn *gorm.DB

// Init Init
func Init() {
	DBConn = connDB(
		config.Val.DBUser,
		config.Val.DBPass,
		config.Val.DBHost,
		config.Val.DBPort,
		config.Val.DBDatabase,
		config.Val.DBMaxLifeTime,
		config.Val.DBMaxConn,
		config.Val.DBIdleConn)
}

func connDB(user, pass, host, port, database string, lifeTime, maxCon, idle int) *gorm.DB {
	addr := fmt.Sprintf(
		"%v:%v@tcp(%v:%v)/%v?charset=utf8&parseTime=true",
		user,
		pass,
		host,
		port,
		database,
	)

	db, err := gorm.Open(mysql.Open(addr), &gorm.Config{})
	if err != nil {
		panic(err) // 連不到就直接panic裡服務重起再連
	}

	sqlDB, err := db.DB()
	if err != nil {
		panic(err)
	}

	sqlDB.SetConnMaxLifetime(time.Duration(lifeTime) * time.Second) // 每條連線的存活時間
	sqlDB.SetMaxOpenConns(maxCon) // 最大連線數
	sqlDB.SetMaxIdleConns(idle)// 最大閒置連線數

	return db
}

新增任務API

[POST] /api/task

參數:
parent_id int
name string

上一篇已經有了table
這邊會根據它的資料型態來建一個struct來存取資料

model/task.go

const (
	// TaskDisable TaskDisable
	TaskDisable = 0
	// TaskAble TaskAble
	TaskAble = 1
	// TaskDone TaskDone
	TaskDone = 2
)

// Task Task
type Task struct {
	ID               int    `json:"id,omitempty"`
	ParentID         int    `json:"parent_id,omitempty"`
	UserID           string `json:"user_id,omitempty"`
	Name             string `json:"name,omitempty"`
	Status           int    `json:"status,omitempty"`
	CreatedTimestamp int64  `json:"created_timestamp"`
}

// TasksTable TasksTable
const TasksTable = "tasks"

// TaskModel TaskModel
var TaskModel = TasksModelObj{
	Table: TasksTable,
}

// TasksModelObj TasksModelObj
type TasksModelObj struct {
	Table string
}

// Create Create
func (m TasksModelObj) Create(task Task) error {
	return DBConn.Table(m.Table).Create(&task).Error
}

新增API接口

main.go

api.POST("/task", middleware.Auth(), handler.CreateTask)

handler/api.go

// CreateTask CreateTask
func CreateTask(c *gin.Context) {
	var taskData model.Task
	c.BindJSON(&taskData)

	taskData.UserID = c.GetString("user_id")
	taskData.Status = model.TaskAble
	taskData.CreatedTimestamp = time.Now().UTC().Unix()

	if err := model.TaskModel.Create(taskData); err != nil {
		log.WithFields(log.Fields{
			"task_data":  taskData,
			"origin_err": err.Error(),
		}).Error("db error")
		res.SystemError(c, res.ErrSystemCode, gin.H{})
		return
	}

	res.Success(c, gin.H{})
}

試打一下
https://ithelp.ithome.com.tw/upload/images/20200919/20129767OFyvHlTyox.png

今天的commit

謝謝大家~


上一篇
Day 10 DB schema
下一篇
Day 12 查詢任務API
系列文
Golang & Vue.js 30天從0打造服務30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言